草庐IT

c++ - Clang、std::next、libstdc++ 和 constexpr-ness

全部标签

c++ - OS X libc++ std::uniform_real_distribution 错误

我在使用C++11的std::uniform_real_distribution编译AppleLLVM版本7.0.2(clang-700.1.81)时看到了一些奇怪的行为。调用operator()会呈现超出分布范围的结果。下面的最小示例程序重现了这个问题//Exampleprogram#include#include#includetemplateconstexpruint64_tpower_of_two(){return2*power_of_two();}templateconstexpruint64_tpower_of_two(){return1;}std::linear_cong

c++ - std::string_view 编译时散列

似乎std::hashfunctions对于C++17string_view不是constexpr的。在我看来,绑定(bind)到constchar[]的字符串View可以在编译时进行哈希处理(这会非常好),或者有什么可以阻止这种情况吗? 最佳答案 从C++14开始(参见17.6.3.4哈希要求,表26),我们有:Thevaluereturnedshalldependonlyontheargumentkforthedurationoftheprogram.[Note:Thusallevaluationsoftheexpression

c++ - 在 QtCreator 的 [Clang]CodeModel 中启用 C++14

如何在ClangCodeModel(甚至“普通”模型)中启用C++14?我在.pro文件中添加了CONFIG+=c++14并且该项目在gcc和下都能正常编译clang但IDE在C++14构造上发出虚假警告让我恼火。当查看“C++代码模型检查器”时,“项目部件->常规”选项卡显示LanguageVersionCXX11尽管有配置条目。IDE的CodeModel似乎没有接受它。 最佳答案 转到工具->选项->C++->代码模型。找到“Clang代码模型警告”组并“复制”当前配置(默认情况下为“几乎所有内容的警告[内置]”)以进行编辑。在

c++ - 类 std::array of objects without default constructors

所以让我们假设我有以下类(class)classNoDefaultConstructor{NoDefaultConstructor()=delete;...};我还有另一个类,它有一个类型为NoDefaultConstructor和其他成员的数组classWrapper{std::arrayarr;...};如何在Wrapper的构造函数中初始化数组(可能在使用std::intializer_list的初始化列表中)?更具体地说,是我可以将参数传递给Wrapper的初始化列表中的数组构造函数以具有类似于以下的构造的唯一方法吗?我正在考虑这样做,因为将来数组的大小可能会发生变化。temp

c++ - 省略 std::bind 中的 std::placeholders

要创建std::function,我是这样做的:-std::functionf=std::bind(&B::fb,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3);voidB::fb(intx,intk,intj){}//example很明显B::fb接收三个参数。为了提高可读性和可维护性,我希望我可以这样调用它:-std::functionf=std::bind(&B::fb,this);//omit_1_2_3问题C++中是否有任何功能可以省略占位符?它应该自动按顺序调用_1、_2、...

C++11 constexpr 导致编译器的内部错误 (C1001)

我正在使用VisualStudio2015Update3。我得到一个fatalerror:(codeC1001):Aninternalerrorhasoccurredinthecompiler.代码如下:templateconstexprTepsilon=std::numeric_limits::epsilon();我读到它已在VisualStudioUpdate2中修复。有人可以解释我为什么会收到此错误吗?提前致谢。 最佳答案 任何内部错误(ICE)都是编译器错误。你得到它是因为你碰巧触发了那个错误。对于此编译器,您可以在Micr

c++ - std::functions 和 lambda 函数传递

我有一个将std::function作为参数的类,我分配了一个lambda函数。它在构造函数中工作,但之后停止工作。调试器在运行第一行后说f是“空的”。为什么?#include#include#includetypedefstd::functionconst&fn;classTestClass{public:TestClass(fn_f):f(_f){F();}voidF(){f("hello");};private:fnf;};intmain(){TestClasst([](std::stringstr){std::cout调用t.F()会导致错误。为什么?我可以通过将其更改为以下内

c++ - 如何像 C++ const/constexpr 一样定义 CUDA 设备常量?

在.cu文件中,我在全局范围内尝试了以下操作(即不在函数中):__device__staticconstdoublecdInf=HUGE_VAL/4;并得到nvcc错误:error:dynamicinitializationisnotsupportedfor__device__,__constant__and__shared__variables.如果可能的话,如何在设备上定义C++const/constexpr?注意1:#define是不可能的,不仅出于美学原因,而且因为在实践中表达式更复杂并且涉及内部数据类型,而不仅仅是double。因此,每次在每个CUDA线程中调用构造函数的代价

c++ - 在不复制的情况下划分 std::string

是否可以在不复制的情况下将std::string分成两个或更多子字符串,就像我们可以使用移动构造函数创建一个新的std::string不复制? 最佳答案 你不能用std::string来做到这一点。但是,您可以使用C++17中的std::string_view来做到这一点。例子:std::stringstr="TheBigStr";std::string_viewp1=std::string_view(str.data()+3,3);字符串View不复制数据,因此在使用View时不应修改str。

c++ - GCC 和 Clang 是否优化逐字段结构复制?

例如给予typedefstructA{inta;intb;intc;}A;typedefstructB{intd;inte;intf;}B;voidf(B&b1,A&a2){b1.d=a2.a;b1.e=a2.b;b1.f=a2.c;}f可以替换为memcpy(特别是如果结构有更多字段)。两个版本会产生相同的代码吗?如果我们复制到的结构的字段少于A怎么办?即typedefstructC{intg;inth;}C;voidh(C&c1,A&a2){c1.g=a2.a;c1.h=a2.b;}我很感兴趣,因为我生成的代码包括这样的结构拷贝,通常会更改字段的顺序,我想知道是否应该对这些情况进行